package com.github.cyf.echarts;

import com.github.cyf.common.util.JacksonUtil;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * @author chenyifan
 * @create 2024-08-13 10:16
 */
public class FreemarkerUtil {

    /**
     * 使用字符串模板和数据对象渲染数据
     * @param content 模板内容字符串
     * @param dataMap 数据对象
     * @return 渲染后的字符串
     */
    public static String renderData(String content, Map<String, ?> dataMap) {
        String result = null;
        try {
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
            // 设置默认编码
            configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());

            // 使用StringTemplateLoader加载字符串模板
            StringTemplateLoader stringLoader = new StringTemplateLoader();
            stringLoader.putTemplate("template", content);
            configuration.setTemplateLoader(stringLoader);
            // 获取模板
            Template template = configuration.getTemplate("template");
            StringWriter writer = new StringWriter();
            // 渲染模板并写入
            template.process(dataMap, writer);
            result = writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


    /**
     * 加载模板并渲染数据
     * @param file 模板文件
     * @param dataMap 数据对象
     * @return
     */
    public static String renderData(File file, Map<String, Object> dataMap) {
        File dir = file.getParentFile();
        String content = null;
        try {
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
            // 设置默认编码
            configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());
            // 设置模板加载的目录
            configuration.setDirectoryForTemplateLoading(dir);
            // 设置模板加载器
            configuration.setTemplateLoader(new FileTemplateLoader(dir));

            // 基于文件名称在设置的目录下获取
            Template template = configuration.getTemplate(file.getName());
            StringWriter writer = new StringWriter();
            // 渲染模板并写入
            template.process(dataMap, writer);
            content = writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content;
    }

    /**
     * 将对象转换为json字符串，并将键名的双引号去掉，值的双引号替换为单引号
     * @param object
     * @return
     */
    public static String getJsonString(Object object) {
        String jsonStr = JacksonUtil.toJsonString(object);
        jsonStr = jsonStr
                .replaceAll("\"([^\"]*?)\":", "$1:") // 使用正则表达式匹配键名的双引号
                .replaceAll("\"", "'");
        return jsonStr;
    }
}
